//模拟--定义方向变量模拟蛇形数组 
#include<iostream>

using namespace std;

const int N = 20;
int arr[N][N];

//定义方向向量
int dx[] = { 1,0,-1,0 };
int dy[] = { 0,1,0,-1 };
int r=sizeof(dx)/sizeof(dx[0]);

int main()
{
	int a; cin >> a;
	int s = 1;
	int x = 1;
	int y = 1;
	int i = 0;
	while (s <= a * a)
	{
		arr[x][y] = s;

		//因为在后面的判断是否越界时还要对越界部分进行修正，
		//故创建新变量A,B来暂时代替行列坐标x,y。
		// 防止因为x,y的改变而使越界修正复杂化。
		 int A = x + dx[i];
		 int B = y + dy[i];

		if (A<1|| A > a ||B <1||B > a || arr[A][B] != 0)
		{
			i = (i + 1) % r;
			A = x + dx[i];
			B = y + dy[i];
		}
		x = A;
		y = B;
		s++;

	}
	for (int i = 1; i <= a; i++)
	{
		for (int j = 1; j <= a; j++)
		{
			printf("%3d", arr[i][j]);
		}
		cout << endl;
	}

	return 0;
}
